package com.jhy.suixianglu.daima20230205;

import java.util.Stack;

/**
 * 请你仅使用两个栈实现先入先出队列。
 * 队列应当支持一般队列支持的所有操作（push、pop、peek、empty）：
 *
 * 实现 MyQueue 类：
 *
 * void push(int x) 将元素 x 推到队列的末尾
 * int pop() 从队列的开头移除并返回元素
 * int peek() 返回队列开头的元素
 * boolean empty() 如果队列为空，返回 true ；否则，返回 false
 * 说明：
 *
 * 你 只能 使用标准的栈操作 —— 也就是只有push to top,peek/pop from top,size, 和is empty操作是合法的。
 * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque（双端队列）来模拟一个栈，只要是标准的栈操作即可。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/implement-queue-using-stacks
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 这里主要思想就是：
 * 一旦我们出栈当中的元素为空的时候 就要把入栈当中的所有元素全部放在出栈当中
 */
public class MyQueue {

    // 定义两个栈 我们的一个进栈 一个出栈
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;
    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }

    /**
     * push的话 我们只需要从stackIn里面进行操作
     * @param x
     * 先进后出
     */
    public void push(int x) {
        stackIn.push(x);
    }

    public int pop() {
        goon();
       return stackOut.pop();
    }

    public int peek() {
        goon();
        return  stackOut.peek();
    }

    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }
    public void  goon(){
        // 如果我们的出栈当中不为空的话 就直接结束
        if(!stackOut.isEmpty()){
            return;
        }
        // 如果入栈当中的不为空的话 就要把入栈当中的元素全部放进到出栈当中。
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}
